
/**
 * author: wzw
 * version: 1.0
 * Time: 11.5
 * 投放装置程序。用于arduino与k210的串口通信、1602液晶显示模块的显示，舵机的控制等
 * 
 * Version:2.0
 * Time:11.25
 * 还是原来的投放装置，但是取消了串口通信，因为我没有做好，更改了显示屏的显示顺序。
 * 
 * 
 */
#include <Servo.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

//定义一个1602液晶显示模块的对象
LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display

//两个舵机的对象
Servo servo1;  //舵机1为270度舵机，旋转投放口的旋转
Servo servo2;  //舵机2为180度舵机，控制投放口开关门

unsigned int PWM=0;
int n1=0;
int n2=0;
int n3=0;
int n4=0;

//计数
int num1 = 0;
int num2 = 0;
int num3 = 0;
int num4 = 0;

/**
 * 对270度舵机的控制
 * 参数：int a，需要转动的角度
 */
void servo270(int a){
  PWM=a;   
  PWM=map(PWM,0,270,500,2500);
  servo2.writeMicroseconds(PWM);
  delay(1000);
}

/**
 * 一些初始化步骤
 */
void setup() {
  lcd.init(); // initialize the lcd
  lcd.backlight(); //Open the backlight
  servo1.attach(6);
  servo2.attach(5);
  Serial.begin(9600);

  pinMode(8,INPUT); //苹果
  pinMode(9,INPUT); //瓶子
  pinMode(10,INPUT);  //电池
  pinMode(11,INPUT);  //香烟
  
  pinMode(A0,INPUT);
  pinMode(A1,INPUT);
  pinMode(A2,INPUT);
  pinMode(A3,INPUT);
  pinMode(13,OUTPUT);

  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(6,OUTPUT);
  pinMode(7,OUTPUT);
}

/**
 * 显示当前投放的垃圾
 * 参数：char n 表示当前投放垃圾的编号
 */
void lcdShow(char n){
  lcd.clear();    //清屏
  if(n == '1'){
    lcd.print("Apple");
  }else if(n == '2'){
    lcd.print("Cans");
  }else if(n == '3'){
    lcd.print("Battary");
  }else if(n == '4'){
    lcd.print("Cigarate");
  }
}

/**
 * name:lcdCount
 * 
 * function:lcd显示屏计数与显示
 * 
 * parameter：int n1 第一种垃圾的数量（apple 苹果）
 *            int n2 第二种垃圾的数量（cans 易拉罐）
 *            int n3 第三种垃圾的数量（smoke 香烟）
 *            int n4 第四种垃圾的数量（cell 电池）
 * return：void
 */
void lcdCount(int n1,int n2,int n3,int n4){
  lcd.clear();    //清屏
  
  lcd.print("Apple ");
  lcd.print(num1);
  if(n1>=10){
    lcd.print(" ");
  }else{
    lcd.print("  ");
  }
  
  lcd.print("Cell ");
  lcd.print(num3);
  
  lcd.setCursor(0, 1); //把光标设置在第0列第1行
  
  lcd.print("Cigarate");
  if(num4<10){
    lcd.print(" ");
  }
  lcd.print(num4);

  lcd.print("can");
  if(num2 < 10){
    lcd.print(" ");
  }
  lcd.print(num2);
  
}

/**
 * 这个函数暂时不用
 */
//void led(int pin)
//{
//  digitalWrite(pin,1);
//  delay(1000);
//  digitalWrite(pin,0);
//  delay(1000);
//  
//}
//


//void loop(){
//  servo270(43);
//
//  delay(1000);
//
//  servo270(100);
//  delay(1000);
//
//  servo270(180);
//  delay(1000);
//
//  servo270(235);
//  delay(1000);
//  
//}
//检测k210的引脚电压  需要先把所有物品识别一编才能进行准确的判断，我也不知道这是为什么
void loop()
{
  servo1.write(67);  //关闭投放口
  servo270(180);     //舵机归位
  
  n1 = digitalRead(8);
  n2 = digitalRead(9);
  n3 = digitalRead(10);
  n4 = digitalRead(11);
  Serial.print(n1);
  Serial.print(n2);
  Serial.print(n3);
  Serial.println(n4);
  Serial.println("***");
  
  Serial.println(num1);
  Serial.println(num2);
  Serial.println(num3);
  Serial.println(num4);
  if(n1 == 0){
    num1++;
    lcdShow('1');
    servo270(100);
    delay(1500);  //延时1500ms等待舵机转到指定角度

    servo1.write(9); //打开投放口
    delay(1000);  
    lcdCount(num1,num2,num3,num4);
    servo1.write(67);  //关闭投放口
    servo270(180);     //舵机归位
  
    delay(1500);
  }
  
  else if(n3 == 0){
    num3++;
    lcdShow('3');
    servo270(180);
    delay(1500);  //延时1500ms等待舵机转到指定角度

    servo1.write(9); //打开投放口
    delay(1000);  
    lcdCount(num1,num2,num3,num4);
    servo1.write(67);  //关闭投放口
    servo270(180);     //舵机归位
    delay(1500);
  }
  
  else if(n2 == 0){
    num2++;
    lcdShow('2');
    servo270(235);
    delay(1500);  //延时1500ms等待舵机转到指定角度

    servo1.write(9); //打开投放口
    delay(1000);  
    lcdCount(num1,num2,num3,num4);
    servo1.write(67);  //关闭投放口
    servo270(180);     //舵机归位
    delay(1500);
  }
  
  else if(n4 == 0){
    num4++;
    lcdShow('4');
    servo270(43);
    delay(1500);  //延时1500ms等待舵机转到指定角度

    servo1.write(9); //打开投放口
    delay(1000);  
    lcdCount(num1,num2,num3,num4);
    servo1.write(67);  //关闭投放口
    servo270(180);     //舵机归位
    delay(1500);
  }
  
}
